/**
 * Created on [2020/1/25 下午11:12] by 刘金龙
 *
 * 项目名称: orion
 *
 * 本程序版权属于福建慧政通信息科技有限公司所有。
 *
 * 任何组织和个人未经福建慧政通信息科技有限公司许可与授权,不得擅自传播、复制、更改该程序的内容。
 * 本程序受版权法和国际条约的保护。如未经授权而擅自复制或传播本程序(或其中任何部分),
 * 将受到严厉的刑事及民事制裁，并将在法律许可的范围内受到最大可能的起诉!
 *
 * ©2021 福建慧政通信息科技有限公司
 */
package com.sunnada.btfvilg.common.response;

/**
 * Result工厂，用于创建Result对象。
 *
 * @author 刘金龙
 */
public final class ResultFactory {

    /**
     * 成功
     *
     * @deprecated 下一个版本将移除该字段。
     */
    public static final int SUCCESS = 1;

    /**
     * 失败
     *
     * @deprecated 下一个版本将移除该字段。
     */
    public static final int FAILED = 0;

    /**
     * 根据给定的响应数据创建操作成功时的Result对象。
     *
     * @param data 响应数据
     * @param <T>  响应数据类型
     * @return 根据给定的响应数据创建操作成功时的Result对象。
     */
    public static <T> Result<T> success(T data) {
        return create(ResponseStatusCode.SUCCESS, data);
    }

    /**
     * 根据给定的消息、响应数据创建Result对象。
     *
     * @param message 消息
     * @param data    响应数据
     * @param <T>     响应数据类型
     * @return 根据给定的消息、响应数据创建Result对象。
     */
    public static <T> Result<T> success(String message, T data) {
        return create(ResponseStatusCode.SUCCESS, message, data);
    }

    /**
     * 根据给定的响应数据创建操作失败时的Result对象。
     *
     * @param data 响应数据
     * @param <T>  响应数据类型
     * @return 根据给定的响应数据创建操作失败时的Result对象。
     */
    public static <T> Result<T> failed(T data) {
        return create(ResponseStatusCode.FAILED, data);
    }

    /**
     * 根据给定的消息、响应数据创建操作失败时的Result对象。
     *
     * @param message 消息
     * @param data    响应数据
     * @param <T>     响应数据类型
     * @return 根据给定的消息、响应数据创建操作失败时的Result对象。
     */
    public static <T> Result<T> failed(String message, T data) {
        return create(ResponseStatusCode.FAILED, message, data);
    }

    /**
     * 根据给定的响应数据创建操作异常时的Result对象。
     *
     * @param data 响应数据
     * @param <T>  响应数据类型
     * @return 根据给定的响应数据创建操作异常时的Result对象。
     */
    public static <T> Result<T> exception(T data) {
        return create(ResponseStatusCode.OPERATION_EXCEPTION, data);
    }

    /**
     * 根据给定的消息、响应数据创建操作异常时的Result对象。
     *
     * @param message 消息
     * @param data    响应数据
     * @param <T>     响应数据类型
     * @return 根据给定的消息、响应数据创建操作异常时的Result对象。
     */
    public static <T> Result<T> exception(String message, T data) {
        return create(ResponseStatusCode.OPERATION_EXCEPTION, message, data);
    }

    /**
     * 根据给定的状态码、消息、响应数据创建Result对象。
     *
     * @param code    状态码
     * @param message 消息
     * @param data    响应数据
     * @param <T>     响应数据类型
     * @return 根据给定的状态码、响应数据创建操作失败时的Result对象。
     */
    public static <T> Result<T> create(int code, String message, T data) {
        return new Result<T>(code, message, data);
    }

    /**
     * 根据给定的状态码、响应数据创建Result对象。
     *
     * @param responseStatusCode 状态码
     * @param data               响应数据
     * @param <T>                响应数据类型
     * @return 根据给定的状态码、响应数据创建的Result对象。
     */
    public static <T> Result<T> create(ResponseStatusCode responseStatusCode, T data) {
        return new Result<T>(responseStatusCode.getCode(), responseStatusCode.getMessage(), data);
    }

    /**
     * 根据给定的状态码、消息、响应数据创建Result对象。
     *
     * @param responseStatusCode 状态码
     * @param message            消息
     * @param data               响应数据
     * @param <T>                响应数据类型
     * @return 根据给定的状态码、消息、响应数据创建的Result对象。
     */
    public static <T> Result<T> create(ResponseStatusCode responseStatusCode, String message, T data) {
        return new Result<T>(responseStatusCode.getCode(), message, data);
    }
}
